﻿Imports SIGI.Common
Imports SIGI.Common.BE

Public Class frmLogin
#Region "<< -Events- >>"

    Private Sub btnCancel_Click(sender As System.Object, e As System.EventArgs) Handles btnCancel.Click
        Application.Exit()
    End Sub

    Private Sub btnAccept_Click(sender As System.Object, e As System.EventArgs) Handles btnAccept.Click
        Login()
    End Sub

    Private Sub txtPassword_KeyPress(sender As System.Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtPassword.KeyPress
        If Convert.ToInt32(e.KeyChar) = Convert.ToInt32(Keys.Enter) Then
            Login()
            e.Handled = True
        End If
    End Sub

    Private Sub lnkGetPassword_LinkClicked(sender As System.Object, e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles lnkGetPassword.LinkClicked
        Dim wFrmGetPassword As frmRecoverPassword = New frmRecoverPassword
        wFrmGetPassword.ShowDialog()
    End Sub

#End Region

#Region "<< -Methods- >>"
    Private Sub Login()
        Dim wFrmMain As frmMain = Nothing
        Dim wUserBE As UserBE = Nothing
        Dim wUserController As UsersController = Nothing


        Try
            'Válido que se ingresen los datos.
            If (String.IsNullOrEmpty(txtUserName.Text.Trim)) Then
                _MsgBox.ShowMessage("Nombre de Usuario", "Ingrese el Nombre de Usuario", frmMessage.MessageType.Error_, frmMessage.MessageButtons.Ok)
                txtUserName.Focus()
            End If
            If (String.IsNullOrEmpty(txtPassword.Text.Trim)) Then
                _MsgBox.ShowMessage("Contraseña", "Ingrese la Contraseña", frmMessage.MessageType.Error_, frmMessage.MessageButtons.Ok)
                txtPassword.Focus()
            End If

            'Busco el usuario
            wUserController = New UsersController
            wUserBE = wUserController.SearchByUserName(txtUserName.Text)
            'Verifico la existencia del usuario o válido que la contraseña sea correcta
            If wUserBE Is Nothing OrElse wUserBE.DecryptPassword() <> txtPassword.Text.Trim Then
                _MsgBox.ShowMessage("Usuario Inexistente", "Usuario y/o Contraseña incorrectos", frmMessage.MessageType.Error_, frmMessage.MessageButtons.Ok)
                Return
            End If

            'Verifico si es una cuenta de usuario activa
            If wUserBE.EndDate.HasValue Then
                _MsgBox.ShowMessage("Login", "La cuenta del usuario actual se encuentra dada de baja. Por favor hable con un administrador.", _
                                     frmMessage.MessageType.Error_, frmMessage.MessageButtons.Ok)
                txtUserName.Focus()
                txtUserName.SelectAll()
                Return
            End If

            'Usuario existe, verifico si esta bloqueado
            If Not VerifyUnbloquedUser(wUserBE) Then Return

            GlobalVariables.gLoguedUser = wUserBE
            'Cargo la pantalla pricipal
            wFrmMain = New frmMain
            wFrmMain.Show()
            Me.Close()
        Catch ex As Exception
            _MsgBox.ShowMessage("Excepción", ex.Message, frmMessage.MessageType.Error_, frmMessage.MessageButtons.Ok)
        Finally
            wUserBE = Nothing
            wUserController = Nothing
        End Try
    End Sub

    Private Function VerifyUnbloquedUser(pUser As UserBE) As Boolean
        Dim wAppConfig As AppConfigController = Nothing
        Dim wUserController As UsersController = Nothing
        Dim wBlockingTime As AppConfigBE = Nothing
        Dim wBlockingTimeLeft As Integer = Nothing
        Dim wTime As Integer = 0

        If pUser.Blocked Then
            'Obtengo el valor de tiempo máximo de bloqueo. El tiempo es en minutos.
            wAppConfig = New AppConfigController
            wBlockingTime = wAppConfig.SearchById(CommonDefinitions.AppConfig_BlockingTimeKey)

            If wBlockingTime Is Nothing Then
                Throw New Exception("Clave Tiempo Máximo Bloqueo: Propiedad Inexistente. El valor debe ser númerico entero")
            ElseIf Not Integer.TryParse(wBlockingTime.Value, wTime) Then
                Throw New Exception("Clave Tiempo Máximo Bloqueo: Propiedad mal configurada. El valor debe ser númerico entero")
            End If

            'Obtengo la tiempo en minutos entre el inicio del bloqueo y el tiempo actual 
            'y verifico si es menor o mayor al tiempo màximo de bloqueo.
            wTime = DateAndTime.DateDiff(DateInterval.Minute, pUser.BlockStarted.Value, Date.Now)
            If wTime < Convert.ToInt32(wBlockingTime.Value) Then
                _MsgBox.ShowMessage("Usuario Bloqueado", "Usuario Bloqueado. Comuniquese con el Administrador " & vbNewLine & "o espere {0} minutos", _
                                    frmMessage.MessageType.Error_, frmMessage.MessageButtons.Ok)
                Return False
            Else
                'Desbloqueo al usuario, pues aún sigue bloqueado.
                wUserController = New UsersController
                wUserController.BlockUser(pUser.UserName, False)
            End If
        End If

        Return True
    End Function
#End Region


End Class
